﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            #region 第一题
            ////一个考试管理系统，需要录入考生成绩，只能录入数字，否则会报类型转换异常。
            ////请编写相关代码，

            ////1、捕获 FormatException 异常，并打印输出“ 异常已处理 ；
            ////2、捕获 OverflowException 异常，数值超出 float 范围的异常，并打印输出“ 异常已处理 ；
            ////3、捕获一般异常 Exception 异常。
            ////4、最终处理finally

            ////录入成绩结束后，请输出， 总学生数 ，总分数 ，平均分 。

            //float Sum = 0;
            //student s1 = new student("张三");
            //student s2 = new student("李四");
            //student s3 = new student("王五");

            //List<student> list = new List<student>() { s1, s2, s3 };

            //try
            //{
            //    while (true)
            //    {

            //        for (int i = 0; i < list.Count; i++)
            //        {

            //            Console.WriteLine($"请录入{list[i].Name}的成绩：");
            //            list[i].Score = float.Parse(Console.ReadLine());
            //            if (!(list[i].Score > 0 && list[i].Score < 150))
            //            {
            //                throw new OverflowException();
            //            }
            //            Sum += list[i].Score;
            //        }
            //        foreach (student item in list)
            //        {
            //            Console.WriteLine(item);
            //        }
            //        Console.WriteLine($"总人数：{list.Count},总分数：{Sum},平均数：{Sum / list.Count}");
            //    }
            //}
            //catch (FormatException e)
            //{
            //    Console.WriteLine(e.Message);
            //    Console.WriteLine("异常已处理");
            //}
            //catch (OverflowException e)
            //{
            //    Console.WriteLine(e.Message);
            //    Console.WriteLine("异常已处理");
            //}
            //catch (Exception e)
            //{
            //    Console.WriteLine(e.Message);
            //    Console.WriteLine("异常已处理");
            //}
            //finally
            //{
            //    Console.WriteLine("Ending");
            //}
            #endregion
            #region 第二题
            //编写一个程序，用以接收用户输入的 两个浮点型 的数值，一个值 表示用户想要 存放在银行账户中的余额，
            //另一个值表示用户想 要从银行账户中 提取 的金额。
            //实现存取款功能，
            //用户功能选择：1、存款，2、取款
            //取款时：
            //当用户想要提取的金额大于余额时，请手动抛出一个 ArgumentOutOfRangeException 参数超出范围的异常，
            //异常信息可以写“取款金额大于余额，请重新输入”
            //，如此以确保取款金额始终不大于当前余额。
            //操作结束，打印输出余额是多少。
            //最后再添加catch一般异常 Exception，使得数据类型转换的异常也能被捕获到。

            Bank user = new Bank();

            Console.WriteLine("请输入您的名字：");
            user.Name = Console.ReadLine();
            Console.WriteLine("请输入余额：");
            user.Money = double.Parse(Console.ReadLine());

            List<Bank> list = new List<Bank>();
            list.Add(user);

            while (true)
            {
                Console.WriteLine("功能选择：1、存款，2、取款 3、查询");
                int key = int.Parse(Console.ReadLine());
                try
                {
                    switch (key)
                    {
                        case 1:

                            for (int i = 0; i < list.Count; i++)
                            {
                                Console.WriteLine("输入你要存款的金额");
                                list[i].Inmoney = double.Parse(Console.ReadLine());
                                user.Money += list[i].Inmoney;
                                Console.WriteLine($"您已存入{list[i].Inmoney},余额：{user.Money}");
                            }
                            break;
                        case 2:

                            for (int i = 0; i < list.Count; i++)
                            {
                                Console.WriteLine("输入你要取款的金额");
                                list[i].Outmoney = double.Parse(Console.ReadLine());
                                if (user.Money < list[i].Outmoney)
                                {
                                    throw new ArgumentOutOfRangeException("取款金额大于余额，请重新输入");
                                }
                                else
                                {
                                    user.Money -= list[i].Outmoney;
                                    Console.WriteLine($"您已取出{list[i].Outmoney},余额：{user.Money}");
                                }
                            }
                            break;
                        case 3:
                            Console.WriteLine($"开户人：{user.Name},");
                            break;
                    }
                }
                catch (ArgumentOutOfRangeException e) 
                {
                    Console.WriteLine(e.Message);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
                finally
                {
                    Console.WriteLine();
                }
            }

            #endregion
        }
    }
    #region Student
    class student
    {
        private string name;
        private float score;

        public student(string name)
        {
            this.name = name;
        }

        public string Name { get => name; set => name = value; }
        public float Score { get => score; set => score = value; }

        public override string ToString()
        {
            return $"{name} 的成绩为：{score}";
        }
    }
    #endregion
    #region Bank
    class Bank
    {
        private string name;
        private double money;
        private double inmoney;
        private double outmoney;


        public string Name { get => name; set => name = value; }
        public double Inmoney { get => inmoney; set => inmoney = value; }
        public double Outmoney { get => outmoney; set => outmoney = value; }
        public double Money { get => money; set => money = value; }

        public override string ToString()
        {
            return base.ToString();
        }
    }
    #endregion 
}
